package com.luobr.backend.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.luobr.backend.model.dto.user.UserAddRequest;
import com.luobr.backend.model.dto.user.UserQueryRequest;
import com.luobr.backend.model.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
import com.luobr.backend.model.vo.user.UserLoginVO;
import com.luobr.backend.model.vo.user.UserQueryVO;

import javax.servlet.http.HttpServletRequest;

/**
 * @author 罗念笙
 * @description 针对表【user(用户)】的数据库操作Service
 * @createDate 2025-02-19 22:10:03
 */
public interface UserService extends IService<User> {

    /**
     * 用户注册
     *
     * @param userAccount   注册账号
     * @param userPassword  注册密码
     * @param checkPassword 确认密码
     * @return
     */
    long registerUser(String userAccount, String userPassword, String checkPassword);

    /**
     * 用户登录
     *
     * @param userAccount  登录账号
     * @param userPassword 登录密码
     * @param request      请求信息
     * @return 脱敏后的用户信息
     */
    UserLoginVO loginUser(String userAccount, String userPassword, HttpServletRequest request);

    /**
     * 获取登录用户信息
     *
     * @param request 请求信息
     * @return 登录用户信息
     */
    UserLoginVO getLoginUser(HttpServletRequest request);

    /**
     * 账号登出
     *
     * @param request 请求信息
     * @return 是否登出成功
     */
    Boolean logoutUser(HttpServletRequest request);

    /**
     * 新增用户（管理员权限）
     *
     * @param userAddRequest 新增用户请求
     * @return 用户id
     * TODO: 用户的账号在数据库中是以唯一键约束，虽然可以防止多线程的问题，但是会导致已经创建的用户被删除之后的账号将不能再给其他用户使用了（逻辑删除和唯一键约束共同导致的）
     */
    Long addUser(UserAddRequest userAddRequest);

    /**
     * 加密密码
     *
     * @param password 加密前密码数据
     * @return 加密后密码数据
     */
    String getEncryptPassword(String password);

    /**
     * 用于将查询请求转为 QueryWrapper对象
     *
     * @param userQueryRequest 查询请求
     * @return QueryWrapper对象
     */
    QueryWrapper<User> getQueryWrapper(UserQueryRequest userQueryRequest);

    /**
     * 将 User 列表转换成 UserQueryVO
     *
     * @return 脱敏后的用户查询列表
     */
    Page<UserQueryVO> getUserQueryVOPage(UserQueryRequest userQueryRequest);
}
